#!/bin/sh

if [ -n "$_VL_IMPORT_STEP_GEN" ] ; then
	return 0;
fi
_VL_IMPORT_STEP_GEN=0


# 加载项目环境
if ! load "$VL_ENV" ; then
	return 1;
fi

# 检查是否需要进行 Auto Gen
#
# 返回值 : 如果需要返回 0
function checkAutoGen() {
	# 首先进入到项目
	cd "$VL_DIR_ROOT"
	local isDoGen=0

	if ! isVLStyleProject || checkVariable "$VL_ARG_GEN_MODE" ; then
		# 非 vl-style 项目, 或者指定生成模式
		# 分为以下几步检查
		# 1 - 检查 configure.ac 是否过期, 如果过期执行重新生成. 这步只判断已存在的 "vl_config_ac_ts", 如果不存在则表示文件未过期
		# 2 - 如果存在 configure 且不存在 "vl_config_ac_ts" 时, 默认已完成生成, 这时需要记录一下当前的 "configure.ac" 的时间戳
		#
		# 如果需要进行编译, 则优先使用项目内的 "autogen.sh" 脚本, 如果不存在, 再按照参数 1 指定的方式进行生成

		if checkFileExpire "$VL_CACHE_FILE_CONFIG_AC_TS" "$VL_FILE_CONFIG_AC" "1"; then
			if ! autogenNormal "$1" ; then
				removeFile "$VL_DIR_ROOT/configure"
				return 1
			fi
			isDoGen=1
		fi

		if ! checkFile "configure" ; then
			# 不存在 configure, 需要生成
			if ! autogenNormal "$VL_ARG_GEN_MODE" ; then
				removeFile "$VL_DIR_ROOT/configure"
				return 1
			fi
			isDoGen=1
		fi

		# 存在 configure 脚本, 默认已生成成功
	elif isVLStyleProject ; then
		# vl-style 项目

		if ! load "$VL_ENV_PART_STEP_FOR_BUILD" ; then
			return 1
		fi

		if ! checkBuild ; then
			return 1
		fi

		# 文件未过期, 不进行重新生成
		if ! checkFileExpire "$VL_CACHE_FILE_CONFIG_AC_TS" "$VL_FILE_CONFIG_AC" ; then
			return 0
		fi		

		case "$VL_TYPE" in
		exec)
			if ! autogenExec ; then
				return 1
			fi
			isDoGen=1
		;;
		lib)
			if ! autogenLibrary ; then
				return 1
			fi
			isDoGen=1
		;;
		esac
	else
		echo ""
		printWarn "project is not a vl-style project, try use \"-ag-exec\" or \"-ag-lib\" again"
		echo ""
		return 1
	fi

	# 确认 .vl-build 文件夹是否创建
	if ! checkDirOrCreate "$VL_DIR_BUILD" ; then
		printError "create \"$VL_DIR_BUILD\" failed."
		return 1
	fi


	# 生成 Configure.ac 时间戳记录文件
	if ! saveFileTs "$VL_CACHE_FILE_CONFIG_AC_TS" "$VL_FILE_CONFIG_AC" ; then
		printError "create \"$VL_CACHE_FILE_CONFIG_AC_TS\" failed"
		return 1
	fi


	# 每次 auto-gen 之后移除编译缓存文件
	if [ "$isDoGen" -eq 1 ] && ! removeFile "$VL_CACHE_FILE_COMPILE" ; then
		printError "delete \"$VL_CACHE_FILE_COMPILE\" failed"
		return 1
	fi

	return 0
}

# 检查是否需要进行 Auto Gen
# 参数 1 : 指定生成方式
#		  1 - 表示按照库项目方式生成
#         2 - 表示按照可执行项目方式生成
#
# 返回值 : 生成成功返回 0
function autogenNormal() {
	# 生成方式检测需要在检查 "autogen.sh" 脚本之前

	local isSuccess=0
	# 存在 autogen.sh, 按照该脚本方式进行生成
	if checkFile "autogen.sh" ; then
		if ./autogen.sh ; then
			# autogen.sh 方式执行成功
			isSuccess=1
		fi
	fi

	if [ $isSuccess -eq 0 ] ; then
		# autogen.sh 不存在或者执行失败
		# 根据参数 1 选择生成方式
		case "$1" in
		1)
			if ! autogenLibrary ; then
				return 1
			fi
		;;
		2)
			if ! autogenExec ; then
				return 1
			fi
		;;
		esac
	fi

	return 0
}

# 自动部署可执行项目 autotools 工具
# 
# 返回值 : 部署成功返回 0
function autogenExec() {
	cd "$VL_DIR_ROOT"

	if ! checkCommandExist "aclocal" ; then
		printError "command \"aclocal\" not exist, please install it and try again"
		return 1
	fi

	if ! aclocal ; then
		printError "aclocal error"
		return 1
	fi


	if ! checkCommandExist "autoheader" ; then
		printError "command \"autoheader\" not exist, please install it and try again"
		return 1
	fi

	if ! autoheader ; then
		printError "autoheader error"
		return 1
	fi

	if ! checkCommandExist "autoconf" ; then
		printError "command \"autoconf\" not exist, please install it and try again"
		return 1
	fi

	if ! autoconf ; then
		printError "autoconf error"
		return 1
	fi

	if ! checkCommandExist "automake" ; then
		printError "command \"automake\" not exist, please install it and try again"
		return 1
	fi

	if ! automake --add-missing; then
		printError "automake error"
		return 1
	fi

	return 0
}

# 自动部署依赖库项目 autotools 工具
# 
# 返回值 : 部署成功返回 0
function autogenLibrary() {
	cd "$VL_DIR_ROOT"

	if ! checkCommandExist "aclocal" ; then
		printError "command \"aclocal\" not exist, please install it and try again"
		return 1
	fi

	if ! aclocal ; then
		printError "aclocal error"
		return 1
	fi


	if ! checkCommandExist "autoheader" ; then
		printError "command \"autoheader\" not exist, please install it and try again"
		return 1
	fi

	if ! autoheader ; then
		printError "autoheader error"
		return 1
	fi

	local cmd_libtoolize
	if checkCommandExist "libtoolize" ; then
		cmd_libtoolize="libtoolize"
	elif checkCommandExist "glibtoolize" ; then
		cmd_libtoolize="glibtoolize"
	else
		printError "command \"autoheader\" or \"glibtoolize\" not exist, please install it and try again"
		return 1
	fi

	if ! $cmd_libtoolize --automake ; then
		printError "$cmd_libtoolize error"
		return 1
	fi

	if ! checkCommandExist "autoconf" ; then
		printError "command \"autoconf\" not exist, please install it and try again"
		return 1
	fi

	if ! autoconf ; then
		printError "autoconf error"
		return 1
	fi

	if ! checkCommandExist "automake" ; then
		printError "command \"automake\" not exist, please install it and try again"
		return 1
	fi

	if ! automake --add-missing; then
		printError "automake error"
		return 1
	fi

	return 0
}